﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace Sped.Sped
{
    /// <summary>
    /// REGISTRO A170: COMPLEMENTO DO DOCUMENTO - ITENS DO DOCUMENTO
    /// </summary>
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ProgId("SpedPisCofins.RegA170")]
    [ComVisible(true)]
    public class RegA170 : IBloco
    {
        /// <summary>
        /// Número seqüencial do item no documento fiscal
        /// </summary>
        public string NUM_ITEM { get; set; }
        /// <summary>
        /// Código do item (campo 02 do Registro 0200)
        /// </summary>
        public string COD_ITEM { get; set; }
        /// <summary>
        /// Descrição complementar do item como adotado no documento fiscal
        /// </summary>
        public string DESCR_COMPL { get; set; }
        /// <summary>
        /// Valor total do item (mercadorias ou serviços)
        /// </summary>
        public double VL_ITEM { get; set; }
        /// <summary>
        /// Valor do desconto do item / Exclusão
        /// </summary>
        public double VL_DESC { get; set; }
        /// <summary>
        /// Código da Base de Cálculo do Crédito, conforme a Tabela indicada no item 4.3.7, caso seja informado
        /// código representativo de crédito no Campo 09 (CST_PIS) ou no Campo 13 (CST_COFINS).
        /// </summary>
        public string NAT_BC_CRED { get; set; }
        /// <summary>
        /// Indicador da origem do crédito:
        ///     0 – Operação no Mercado Interno
        ///     1 – Operação de Importação
        /// </summary>
        public string IND_ORIG_CRED { get; set; }
        /// <summary>
        /// Código da Situação Tributária referente ao PIS/PASEP – Tabela 4.3.3.
        /// </summary>
        public string CST_PIS { get; set; }
        /// <summary>
        /// Valor da base de cálculo do PIS/PASEP.
        /// </summary>
        public double VL_BC_PIS { get; set; }
        /// <summary>
        /// Alíquota do PIS/PASEP (em percentual)
        /// </summary>
        public double ALIQ_PIS { get; set; }
        /// <summary>
        /// Valor do PIS/PASEP
        /// </summary>
        public double VL_PIS { get; set; }
        /// <summary>
        /// Código da Situação Tributária referente ao COFINS – Tabela 4.3.4.
        /// </summary>
        public string CST_COFINS { get; set; }
        /// <summary>
        /// Valor da base de cálculo da COFINS
        /// </summary>
        public double VL_BC_COFINS { get; set; }
        /// <summary>
        /// Alíquota do COFINS (em percentual)
        /// </summary>
        public double ALIQ_COFINS { get; set; }
        /// <summary>
        /// Valor da COFINS
        /// </summary>
        public double VL_COFINS { get; set; }
        /// <summary>
        /// Código da conta analítica contábil debitada/creditada
        /// </summary>
        public string COD_CTA { get; set; }
        /// <summary>
        /// Código do centro de custos
        /// </summary>
        public string COD_CCUS { get; set; }

        public override bool ValidaRegistro(ref string Erro)
        {
            var ValidacaoOK = true;
            Erro = "";

            if (string.IsNullOrEmpty(this.NUM_ITEM) || Convert.ToInt32(this.NUM_ITEM) <= 0)
            {
                this.NUM_ITEM = string.Empty;
                Erro += "\r\n* Registro A170 - Número seqüencial do item no documento fiscal Inválido.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.COD_ITEM))
            {
                this.COD_ITEM = string.Empty;
                Erro += "\r\n* Registro A170 - Código do item Inválido.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.DESCR_COMPL))
                this.DESCR_COMPL = string.Empty;

            if (string.IsNullOrEmpty(this.NAT_BC_CRED))
                this.NAT_BC_CRED = string.Empty;

            if (string.IsNullOrEmpty(this.IND_ORIG_CRED))
                this.IND_ORIG_CRED = string.Empty;

            if (!this.IND_ORIG_CRED.StringIN("0-1"))
            {
                Erro += "\r\n* Registro A170 - Indicador da origem do crédito Inválido.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.CST_PIS))
                this.CST_PIS = string.Empty;

            if (string.IsNullOrEmpty(this.CST_COFINS))
                this.CST_COFINS = string.Empty;

            if (string.IsNullOrEmpty(this.COD_CTA))
                this.COD_CTA = string.Empty;

            if (string.IsNullOrEmpty(this.COD_CCUS))
                this.COD_CCUS = string.Empty;

            if (((this.VL_BC_PIS * this.ALIQ_PIS) / 100) != this.VL_PIS)
            {
                Erro += "\r\n* Registro A170 - Valor do PIS Difere do Cálculo VL_BC_PIS * ALIQ_PIS.";
                ValidacaoOK = false;
            }

            if (((this.VL_BC_COFINS * this.ALIQ_COFINS) / 100) != this.VL_COFINS)
            {
                Erro += "\r\n* Registro A170 - Valor do Cofins Difere do Cálculo VL_BC_PIS * ALIQ_PIS.";
                ValidacaoOK = false;
            }

            return ValidacaoOK;
        }

        public override string Layout()
        {
            var Linha = string.Empty;

            Linha += "A170" + this.Delimitador;
            Linha += this.NUM_ITEM.Trim() + this.Delimitador;
            Linha += this.COD_ITEM.Trim() + this.Delimitador;
            Linha += this.DESCR_COMPL.Trim().removeFormatacao() + this.Delimitador;
            Linha += this.VL_ITEM.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.VL_DESC.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.NAT_BC_CRED.Trim() + this.Delimitador;
            Linha += this.IND_ORIG_CRED.Trim() + this.Delimitador;
            Linha += this.CST_PIS.Trim() + this.Delimitador;
            Linha += this.VL_BC_PIS.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.ALIQ_PIS.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.VL_PIS.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.CST_COFINS.Trim() + this.Delimitador;
            Linha += this.VL_BC_COFINS.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.ALIQ_COFINS.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.VL_COFINS.FormatoValorSped(2).Trim() + this.Delimitador;
            Linha += this.COD_CTA.Trim() + this.Delimitador;
            Linha += this.COD_CCUS.Trim() + this.Delimitador;

            return Linha.Trim();
        }
    }
}
